package com.founder.devwork.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Positive;
import java.time.LocalDateTime;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 存储提交记录，支持多实例
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("commit_log")
public class CommitLog {

    /**
     * 唯一ID，本地生成全局唯一ID（避免 GitLab ID 冲突）
     */
    @TableId(type = IdType.ASSIGN_UUID)
    private String id;

    /**
     * commit SHA
     */
    @NotBlank(message = "sha commit SHA不能为空")
    @TableField("sha")
    private String sha;

    /**
     * 关联导入日志ID
     */
    @NotBlank(message = "importLogId 关联导入日志ID不能为空")
    @TableField("import_log_id")
    private String importLogId;

    /**
     * 实例标识（确保 SHA 跨实例唯一）
     */
    @NotBlank(message = "gitInstance gitlab实例标识不能为空")
    @TableField("git_instance")
    private String gitInstance;

    /**
     * 关联仓库ID
     */
    @NotNull(message = "repositoryId 关联仓库ID不能为空")
    @TableField("repository_id")
    private Long repositoryId;

    /**
     * 提交消息
     */
    @TableField("message")
    private String message;

    /**
     * 作者邮箱
     */
    @TableField("author_email")
    private String authorEmail;

    /**
     * 作者名称
     */
    @TableField("author_fullname")
    private String authorFullname;

    /**
     * 作者提交时间
     */
    @NotNull(message = "authoredDate 作者提交时间不能为空")
    @TableField("authored_date")
    private LocalDateTime authoredDate;

    /**
     * 提交者邮箱
     */
    @TableField("committer_email")
    private String committerEmail;

    /**
     * 提交者名称
     */
    @TableField("committer_fullname")
    private String committerFullname;

    /**
     * 提交时间
     */
    @NotNull(message = "committedDate 提交时间不能为空")
    @TableField("committed_date")
    private LocalDateTime committedDate;

    /**
     * 添加行数
     */
    @NotNull(message = "additions 添加行数不能为空")
    @Positive(message = "additions 添加行数不能为负数")
    @TableField("additions")
    private Integer additions;

    /**
     * 删除行数
     */
    @NotNull(message = "deletions 删除行数不能为空")
    @Positive(message = "deletions 删除行数不能为负数")
    @TableField("deletions")
    private Integer deletions;

    /**
     * 总变化行数
     */
    @NotNull(message = "totalChanges 总变化行数不能为空")
    @Positive(message = "totalChanges 总变化行数不能为负数")
    @TableField("total_changes")
    private Integer totalChanges;

    /**
     * 提交URL
     */
    @NotBlank(message = "webUrl 可web访问的提交的URL不能为空")
    @TableField("web_url")
    private String webUrl;

    /**
     * 提交类型, 0: root commit, 1: normal commit, 2: merge commit
     */
    @NotNull(message = "commitType 提交类型不能为空")
    @NotNull(message = "commitType 提交类型不能为空")
    @Min(value = 0, message = "commitType 只能是0、1、2")
    @Max(value = 2, message = "commitType 只能是0、1、2")
    @TableField("commit_type")
    private Integer commitType;

    /**
     * 记录更新时间
     */
    @NotNull(message = "updatedAt 记录更新时间不能为空")
    @TableField("updated_at")
    private LocalDateTime updatedAt;
}
